package projeto.controller.testes;

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import junit.framework.Assert;

import org.junit.Before;
import org.junit.Test;

import projeto.controller.ControleDeUsuarios;
import projeto.model.Usuario;

public class ControleDeUsuariosTest {
	
	private Usuario user1,user2,userTeste;
	private List<Integer> opinioesZeradas = Arrays.asList(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
	private Integer[] opinioes1 = {4,2,0,0,5,1,1,1,-1,2,-4,2,0,-5,-2,4,0,0,3,3,-2,0,0,0,4,3,0,0,0,0,-1,0,0,0,2,0,0,0,2};
	private List<Integer> listaOpinioes1 = Arrays.asList(opinioes1);
	private Integer[] opinioes2 = {3,0,0,0,0,0,0,0,2,3,2,0,0,1,0,4,0,0,0,5,0,0,0,0,0,0,0,0,1,2,0,0,0,2,0,0,3,0,0};
	private List<Integer> listaOpinioes2 = Arrays.asList(opinioes2);
	private List<Usuario> usuarios;
	private ControleDeUsuarios userControl;
	
	@Before
	public void constroiControle()throws Exception{
		user1 = new Usuario("13/05/2011 18:35:48","Nazareno",listaOpinioes1);
		user2 = new Usuario("13/05/2011 18:46:59","Joao",listaOpinioes2);
		userTeste = new Usuario("dd/MM/yyyy HH:mm:ss","Anonimo 1",opinioesZeradas);
		usuarios = new ArrayList<Usuario>();
		usuarios.add(user1);
		usuarios.add(user2);
		criaArquivoTeste("ArquivoDeUsuarioValido.data",usuarios);
		userControl = ControleDeUsuarios.getInstance("ArquivoDeUsuarioValido.data");
	}
	
	
	@Test
	public void testGetInstance() {
		
		ControleDeUsuarios otherInstance = ControleDeUsuarios.getInstance("ArquivoDeUsuarioValido.data");
		Assert.assertTrue("Erro ControleDeUsuario getInstance, instancias diferentes",otherInstance.equals(userControl));
		
	}

	@Test
	public void testAddUsuario() {
		
		Assert.assertEquals("Erro tamanho de Lista de usuarios incorreto", 2, userControl.getListaDeUsuarios().size());
		userControl.addUsuario(user1);
		Assert.assertEquals("Erro tamanho de Lista de usuarios incorreto",3,userControl.getListaDeUsuarios().size());
	}

	@Test
	public void testRemoveUsuario() {
		
		
		Assert.assertEquals("Erro tamanho de Lista de usuarios incorreto",3 , userControl.getListaDeUsuarios().size());
		userControl.removeUsuario(null);
		Assert.assertEquals("Erro tamanho de Lista de usuarios incorreto",3 , userControl.getListaDeUsuarios().size());
		userControl.removeUsuario(user1);
		Assert.assertEquals("Erro tamanho de Lista de usuarios incorreto",2,userControl.getListaDeUsuarios().size());
		userControl.removeUsuario(user2);
		Assert.assertEquals("Erro tamanho de Lista de usuarios incorreto",1,userControl.getListaDeUsuarios().size());
		userControl.removeUsuario(user1);
		Assert.assertEquals("Erro tamanho de Lista de usuarios incorreto",0,userControl.getListaDeUsuarios().size());
		userControl.removeUsuario(user1);
		Assert.assertEquals("Erro tamanho de Lista de usuarios incorreto",0,userControl.getListaDeUsuarios().size());
		
	}

	@Test
	public void testGetListaDeUsuarios() {
		userControl.addUsuario(user1);
		userControl.addUsuario(user2);
		Assert.assertTrue("Erro em getListaDeUsuarios lista diferente da esperada",userControl.getListaDeUsuarios().equals(usuarios));
		Assert.assertFalse("Erro em getListaDeUsuarios lista diferente da esperada",userControl.getListaDeUsuarios().equals(null));
	}

	@Test
	public void testCriaUsuario()throws Exception {
		userControl.criaUsuario();
		Assert.assertTrue("Erro em adicionaUsuario usuario adicionado de forma incorreta", userTeste.equals(userControl.getUsuario()));
	}

	@Test
	public void testGetUsuario() {
		
		Assert.assertTrue("Erro em getUsuario usuario diferente do esperado",userTeste.equals(userControl.getUsuario()));
		
	}

	@Test
	public void testEscreveUsuario() {
		
		userControl.escreveUsuario(userTeste,"ArquivoUsuarioValido.data");
		usuarios.add(userTeste);
		Assert.assertTrue("Erro em escreveUsuario usuario nao adicionado a lista", usuarios.equals(userControl.getListaDeUsuarios()));	
	}
	
	private void criaArquivoTeste(String fileName, List<Usuario> users){
		PrintWriter outputStream = null;
		String linhaInicial = "Indicação de data e hora;Seu nome;Bar do Cuscuz e Restaurante;Baixinho Bar e Restaurante;Bar do George;Bar do Santos;Bodão Bar e Restaurante;Bonaparte;Bongustaio;Cabana do Possidônio;Cantina da Sayonara;Cantina de Dona Inês;Cantina de Olavo;Cantina do Departamento de Meteorologia;Cantina do Hall das Placas;Cantinho Universitário;Chinatown;Divino Fogão;Fazenda;Giraffas;Girassol;Gulas;Manoel da carne de sol;Marmitaria ArtCulinária;Marmitaria Bom paladar;Marmitaria da Mama;Paladar;Pedro da Picanha;Qdoca Bar e Restaurante;Restaurante Brasília;Restaurante da Quadra;Restaurante do Alexandre;Restaurante do Paraná;Restaurante Golden in China;Restaurante Lay China;Riso;Spolleto;Super China Restaurante;Trailer do Marcus;Tuxá;Varandas Bar e Restaurante";
		
		try{
			outputStream = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName),"UTF-8")));
			if(users != null){
				outputStream.println(linhaInicial);
				for(Usuario u: users){
					outputStream.println(u.toString());
				}				
			}
			
		}catch(FileNotFoundException e2){

		}catch(IOException e){
		}
		finally{
			if (outputStream != null) {
	            outputStream.close();
	         }
		}
	}
}
